# @Time       : 2020/7/21 9:56
# @USER     : moming
# @File         : 011
# @Software : PyCharm
# @license  : Copyright(C), xxxCompany
# @Email    : 15229996355@163.com


#本版本使用函数编程对前面的代码进行优化



import os
from os import path
import requests
import re
import time


#头部函数
def Head():
    print(
        "\t\t\t*********   ***      \t\t\t******       \t   *****   \t **           ** \t ****     *** \t ***         \t   *****   \t       ***       \t ******")
    print(
        "\t\t\t*********   ***      \t\t\t***   ***    \t  *** ***  \t  *     *     *  \t *****    *** \t ***         \t  *** ***  \t      *****      \t ***   ***")
    print(
        "\t\t\t   ***      ***      \t\t\t***     ***  \t ***   *** \t  **   ***   **  \t *** ***  *** \t ***         \t ***   *** \t    **     **    \t ***     ***")
    print(
        "\t\t\t   ***      ***      \t\t\t***     ***  \t ***   *** \t   *  ** *   *   \t ***  *** *** \t ***         \t ***   *** \t    *********    \t ***     ***")
    print(
        "\t\t\t   ***      ***      \t\t\t***     ***  \t ***   *** \t   ** *   * **   \t ***   ****** \t ***         \t ***   *** \t   ***********   \t ***     ***")
    print(
        "\t\t\t   ***      *********\t\t\t***   ***    \t  *** ***  \t   ***     ***   \t ***    ***** \t *********** \t  *** ***  \t  **         **  \t ***   ***")
    print(
        "\t\t\t   ***      *********\t\t\t******       \t   *****   \t    *       *    \t ***     **** \t *********** \t   *****   \t ***         *** \t ******")

    print("\t\t\t$$$欢迎来到1.9.1版本，本版本可以自己在下载指定的小说$$$\t\t\t\n\n\n")

    print("\t\t\t请在您的浏览器上面输入：www.23txt.com\t\t\t\n\n\n")
    print("\t\t\t请在该网站上选取您想下载的小说，跳转到它的目录界面，复制网址作为该小说的链接。\t\t\t\n\n\n")
    start_url = input("请输入您要下载的小说链接，例如：https://www.23txt.com/files/article/html/61/61545/:")
    print("！！！请将你的命令提示符最大化，否则将引起您视觉上强烈不适！！！")
    return(start_url)


#文件名函数
def Fname(html):
    file_name = re.findall(r"<meta property=\"og:title\" content=\"(.*)\"/>", html.text)  # 获取书名
    file_name = str(file_name)
    file_name = file_name.replace('[', '').replace(']', '')
    file_name = str(file_name)
    file_name=file_name.replace("'","")
    return file_name


#章节id函数
def Linkid(html):
    link = re.findall(r'<a href="(/files/article/html.*?\.html)"  >.*?</a>', html.text)
    return link


#章节名函数
def Link(neirong):
    chapter_name = re.findall(r'<h1>(.*)</h1>', neirong.text)[0]
    return chapter_name


#下载函数
def Download(neirong):

    # 提取正文
    txt = re.findall(r'<div id="content">(.*?)</div>', neirong.text, re.S)[0]

    # 优化小说内容
    txt = txt.replace(' ', '')
    txt = txt.replace('<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;', '\n')
    txt = txt.replace('&nbsp;', '  ')
    txt = txt.replace('[', '').replace(']', '')
    txt = txt.replace('<br><br>', '\n  ')
    txt= txt.replace('<br/><br/> ', "\n")
    txt = txt.replace('<br>		 ', " ")
    txt = txt.replace('&amp;lt;', " ")
    txt = txt.replace(' /p&amp;gt; /ter&amp;gt;', " ")
    txt = txt.replace('/p&amp;gt;', " ")
    return txt


#写入函数
def Write(save_path,chapter_name,txt):
    if path.exists(save_path):
        with open(save_path + "\\{}.txt".format(file_name), "a", encoding='UTF-8') as f:
            f.write('\t' + str(chapter_name) + '\t\n')
        with open(save_path + "\\{}.txt".format(file_name), "a", encoding='UTF-8') as f:
            f.write(txt + '\n')
        print("-$下载完毕$-\t\t\t\t\t{}\t\t\t\t\t-$下载完毕$-\n\n\n".format(chapter_name))

    else:
        os.makedirs(save_path)
        print("未发现下载目录已创建"+save_path + "为下载目录")
        with open(save_path + "\\{}.txt".format(file_name), "a", encoding='UTF-8') as f:
            f.write('\t' + str(chapter_name) + '\t\n')
        with open(save_path + "\\{}.txt".format(file_name), "a", encoding='UTF-8') as f:
            f.write(txt + '\n')
        print("-$下载完毕$-\t\t\t\t\t{}\t\t\t\t\t-$下载完毕$-\n\n\n".format(chapter_name))


#判断函数
def Judge(ans):
    if (ans!=1):
        print("谢谢您的使用,本软件将在10s后关闭")
        time.sleep(10)
        exit()
    elif(ans==1):
        pass

while True:
    start_url =Head()

    # 爬取html页面
    s = requests.Session()
    html = s.get(start_url)

    # 获取书名
    file_name = Fname(html)

    # 获取章节id
    link = Linkid(html)


    # 循环下载各个章节
    for i in link:
        url = 'https://www.23txt.com' + i  # 下载章节 字符串连接网址
        print("****￥￥****￥￥****￥￥****￥￥****￥￥****￥￥{}一共{}章".format(file_name, len(link)) + "￥￥****￥￥****￥￥****￥￥****￥￥****￥￥****\n\n\n")
        # 网页源代码
        s1 = requests.Session()
        r1 = s1.get(url)
        r1.encoding = 'gbk'

        link_name = Link(r1)
        txt = Download(r1)

        save_path = 'C:\\小说'  # 创建存储路径
        Write(save_path, link_name, txt)

    print("{}下载完成，存放在C盘的小说目录下。".format(file_name))
    print(("请问您是选择继续下载，还是退出。"))
    ans = int(input("继续请输入1，退出请输入其他:"))
    Judge(ans)





